#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
#include <complex>

using namespace std;
using namespace cv;

typedef complex<float> usetype;

Mat elmult(Mat_<usetype> *A, Mat_<usetype> *B)
{
	const int Arows = A->rows;
	const int Acols = A->cols;
	Mat C = Mat_<usetype>(Arows, Acols, 0.0);
	for(int i = 0; i < Arows; i++)
	{
		for(int j = 0; j < Acols; j++)
		{
			C.at<usetype>(i,j) = A->at<usetype>(i,j) * B->at<usetype>(i,j);
		}
	}
	return C;
}

Mat eldiv(Mat_<usetype> *A, Mat_<usetype> *B)
{
	const int Arows = A->rows;
	const int Acols = A->cols;
	Mat C = Mat_<usetype>(Arows, Acols, 0.0);
	for(int i = 0; i < Arows; i++)
	{
		for(int j = 0; j < Acols; j++)
		{
			C.at<usetype>(i,j) = A->at<usetype>(i,j) / B->at<usetype>(i,j);
		}
	}
	return C;
}

void merge2(Mat plane1, Mat plane2, Mat_<usetype> output)
{
	Mat planes[] = {plane1, plane2};
	merge(planes, 2, output);
}